"""

Function Calling Demo
需求：加法器。用户输入任意可以用加法解决的问题，都能得到计算结果。

"""
from dotenv import load_dotenv,find_dotenv
from openai import OpenAI
import os
import json
from math import *
_ = load_dotenv(find_dotenv())

clinet = OpenAI(
    api_key = os.getenv("OPENAI_API_KEY"),
    base_url= os.getenv("OPENAI_API_BASE")
)


def get_completion(messages,model = 'gpt-3.5-turbo-1106'):
    response = clinet.chat.completions.create(
        model=model,
        messages=messages,
        temperature=0,
        # 配置Function 
        tools=[
            {
                'type':'function',
                "function":{
                    "name":"add_sum",
                    "description":'给一组数相加求和',
                    "parameters":{  #实际要调用的函数的入参
                        "type":"object",  
                        "properties":{
                             "number":{    # 参数名   
                                'type':"array",   # 参数类型
                                "items":{         # item 参数名
                                    "type":"number"
                                }
                            }
                        }
                    }
                }
            }
        ],
    )
    # 返回 LLM 大模型信息
    return response.choices[0].message

def startChat():
    prompt = "Tell me ths sum of 1,2,3,4,5,6,7,8,9"

    message = [
        {'role':'system','content':'你是一个数学老师'},
        {'role':'user','content':prompt}
    ]
    # 下面是关键步骤
    # 这一步是将问题给到 LLM，LLM 判断是否需要使用 function Calling
    response = get_completion(message)
    #  这是一个容错判断
    if(response.content is None):
        response.content = ""
    print(response) 
    #将 resonse 添加到 message 中
    message.append(response)

    print("----  -GPT回复————————")
    """
    ChatCompletionMessage(content='', 
    role='assistant', 
    function_call=None, 
    tool_calls=[ChatCompletionMessageToolCall(id='call_JXNIVtFUk3gQOLl38OUEMs34', 
    function=Function(arguments='{"number":[1,2,3,4,5,6,7,8,9]}', name='add_sum'), type='function')])
     以上是 GPT 的回复，tool_calls 有数据，说明需要进行 FunC
    """ 
    print(response)

    if(response.tool_calls is not None):
        # 取第一个函数
        tool_call = response.tool_calls[0]
        # 判断这个函数的名称是否和定义的相同
        if(tool_call.function.name == 'add_sum'):
            # 拿到 LLM 帮我做分析出啦的入参，并且进行解析
            args = json.loads(tool_call.function.arguments)
            # 拿出 args 这个接送中的 number 对应的 value，并且设置给执行的函数
            # 拿到计算结果
            result = sum(args["number"])
            print("----函数返回-----")
            print(result)
            #将计算后的结果通过这样的json 加入到 message 中。 
            message.append(
                {
                    "tool_call_id":tool_call.id,
                    "role":'tool', # 表示这是一个 funC 的返回
                    "name":"sun",  # 起一个名称
                    "content":str(result)  # 一定要用 String 的方式进行传递
                }
            )

            print(message)
            """
            [{'role': 'system', 'content': '你是一个数学老师'},
            {'role': 'user', 'content': 'Tell me ths sum of 1,2,3,4,5,6,7,8,9'}, 
            ChatCompletionMessage(content='', role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_WgLCZA40MeIXPzhaSEwCS5dR', function=Function(arguments='{"number":[1,2,3,4,5,6,7,8,9]}', name='add_sum'), type='function')]), 
            {'tool_call_id': 'call_WgLCZA40MeIXPzhaSEwCS5dR', 'role': 'tool', 'name': 'sun', 'content': '45'}]
            """
            print("----最终回复----")

            #The sum of 1, 2, 3, 4, 5, 6, 7, 8, 9 is 45.

            print(get_completion(message).content)



if __name__ == '__main__':
    startChat()